#include<iostream>

//RAII: Resource access is initialized 资源获取即初始化
//资源的获取和释放 和 对象的生命周期   绑定

//浅拷贝问题：类的成员中有指针变量采用RAII机制，但是在拷贝时只是拷贝了指针的值，导致两个指针指向同一个堆上空间
//释放时导致了二次释放问题

//深度拷贝：不能简单地拷贝指针成员，而是赋值堆上空间
class  Test
{
private:
    int *a;
public:
    //类内留下声明
    Test();
    
    Test(int a);

    Test(const Test& t);  //初始化深度拷贝

    Test copy();

    void operator=(const Test& t); //赋值运算符深度拷贝

    void SetValue(int n);

    void Print();

    ~ Test();
};

//类外定义
//this指针：每个类都会带的，指向当前的对象的一个指针
Test::Test()
     {
        a= new int;
     }

//用this去区分形参变量和成员变量
Test::Test(int a)
     {
        this->a=new int;
        *this->a=a;
     }

Test::Test(const Test& t)  //初始化深度拷贝
    {
        a= new int;
        *a=*t.a;
    }

Test Test::copy() //拷贝自己返回给别人
    {
        return *this;  //*this：当前对象
    }

void Test::operator=(const Test &t)
    {
        *a=*t.a;
    }

void Test::SetValue(int n)
    {
        *a=n;
    }

void Test::Print()
    {
        std::cout<<*a<<std::endl;
    }

Test:: ~ Test()
    {
        delete a;
    }

int main()
{
    Test t;
    // Test t1(t);
    Test t1;
    t1=t; //赋值运算符重载
    // t.SetValue(10);
    t.Print();
    return 0;
}
